Подключение метода /api/v1/auth/logout на API-Шлюзе

Маршрутизация HTTP-запроса, вызов gRPC-клиента Auth и управление пулом активных WebSocket-соединений.

Author

Services Task & Simulation Framework Documentation

Published

July 13, 2026

NoteКраткая карточка задачи
  • Репозиторий / Компонент: backend-api (API Gateway / Шлюз).
  • Категория: Подключение метода к шлюзу.
  • Контракт взаимодействия: Внешний POST /api/v1/auth/logout -> Внутренний gRPC AuthService.LogoutUser.
  • Спецификация gRPC контракта: См. Раздел: Protobuf Контракт
  • Статус: Готово к реализации

  • Предварительные условия (Prerequisites):

    1. Убедиться, что клиентские gRPC-стабы (stubs) для сервиса AuthService успешно сгенерированы и обновлены в зависимостях репозитория шлюза на основе актуального Protobuf Контракта.
  • Инструкция по шагам:

    1. На Шаге 2 (Прием и роутинг запроса): Зарегистрировать внешний HTTP-маршрут POST /api/v1/auth/logout. Настроить Pydantic/DTO валидацию тела запроса для извлечения обязательного поля refresh_token. Обеспечить сквозное логирование по заголовку X-Request-ID.
    2. На Шаге 3 (gRPC-клиент): Извлечь строковый Access Token из заголовка Authorization: Bearer <token>. Распаковать его в памяти шлюза (без похода в БД) для получения user_id. Сформировать gRPC-сообщение LogoutRequest, передав в него user_id и refresh_token, и направить вызов в auth-service.
    3. Обработка системных статусов: Реализовать перехват gRPC-ошибок от бэкенда. Если auth-service возвращает INVALID_ARGUMENT, транслировать её клиенту как HTTP 400 Bad Request. Если возвращается ошибка Fail-Close (ошибка блэклиста Redis), корректно отдавать клиенту HTTP 503 Service Unavailable.
    4. На Шаге 7 (Управление WebSocket-стримом): При получении от бэкенда успешного ответа LogoutResponse (success: true), обратиться к внутреннему менеджеру соединений шлюза (WebSocket Connection Manager). По полученному ранее user_id идентифицировать активную сессию WSS-стрима (/ws/push-stream/{id}) конкретно для данного устройства и принудительно вызвать метод stream.close(code=1000, reason="SESSION_TERMINATED").
    5. Финальный ответ: Сформировать успешный HTTP-ответ 200 OK со строгим соответствием JSON-структуры успешного завершения сессии (SESSION_TERMINATED).